/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SubsistemaFinanzas;

import SubsistemaPaciente.OrdenDeDerivacion.*;
import Profesionales.DialogoInfoProfesionalExterno;
import SubsistemaPaciente.DialogoInfoPaciente;
import clienteSandraParada.Login;
import clienteSandraParada.Mensajeria;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import service.OrdenDeDerivacion;
import service.Paciente;
import service.UsuarioProfesional;

/**
 *
 * @author Rodrigo
 */
public class DialogoInfoOrdenesDeDerivacion extends javax.swing.JDialog {

    private OrdenesDeDerivacion der;
    private Long idDerivacion;

    /**
     * construcor de la clase que inicializa la orden de derivacion asociada a un convenio
     * @param parent
     * @param modal
     * @param der
     * @param id
     */
    public DialogoInfoOrdenesDeDerivacion(java.awt.Frame parent, boolean modal, OrdenesDeDerivacion der, Long id) {
        super(parent, modal);
        initComponents();
        campoCostoAtencionFocusLost();
        setIconImage(new ImageIcon(getClass().getResource("/GUI/Img/logo2.png")).getImage());
        this.der = der;
        this.idDerivacion = id;


    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel3 = new javax.swing.JPanel();
        campoRutPaciente = new javax.swing.JTextField();
        jLabel10 = new javax.swing.JLabel();
        comboBoxPaciente = new javax.swing.JComboBox();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jLabel11 = new javax.swing.JLabel();
        jLabel12 = new javax.swing.JLabel();
        campoProfesional = new javax.swing.JTextField();
        campoRutProfesional = new javax.swing.JTextField();
        jPanel1 = new javax.swing.JPanel();
        campoMontoaPagar = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        campoCostoAtencion = new componentes.Dinero();
        jLabel13 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        especialidad = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        diagnostico = new javax.swing.JTextField();
        fechaEmision = new javax.swing.JTextField();
        botonAceptar = new javax.swing.JButton();
        botonCancelar = new javax.swing.JButton();
        mensajeriaInformacion = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Datos paciente"));

        campoRutPaciente.setEditable(false);

        jLabel10.setText("Nombre:");

        comboBoxPaciente.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Seleccionar" }));
        comboBoxPaciente.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                comboBoxPacienteItemStateChanged(evt);
            }
        });

        jLabel8.setText("*");

        jLabel9.setText("Rut:");

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel10)
                    .addComponent(jLabel9))
                .addGap(44, 44, 44)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addComponent(comboBoxPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, 200, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 18, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(campoRutPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel10)
                .addGap(22, 22, 22)
                .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(28, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel8)
                    .addComponent(comboBoxPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(campoRutPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(35, 35, 35))
        );

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Datos profesional externo"));

        jLabel11.setText("Rut profesional:");

        jLabel12.setText("Profesional:");

        campoProfesional.setEditable(false);

        campoRutProfesional.setEditable(false);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel11)
                    .addComponent(jLabel12))
                .addGap(10, 10, 10)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(campoRutProfesional, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(campoProfesional, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(46, 46, 46))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGap(17, 17, 17)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel11)
                    .addComponent(campoRutProfesional, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel12)
                    .addComponent(campoProfesional, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Datos orden de derivación"));

        campoMontoaPagar.setEditable(false);
        campoMontoaPagar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                campoMontoaPagarActionPerformed(evt);
            }
        });

        jLabel2.setText("Costo atención:");

        campoCostoAtencion.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusLost(java.awt.event.FocusEvent evt) {
                campoCostoAtencionFocusLost(evt);
            }
        });

        jLabel13.setText("Monto a pagar: ");

        jLabel3.setText("Especialidad :");

        jLabel1.setText("*");

        especialidad.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                especialidadActionPerformed(evt);
            }
        });

        jLabel7.setText("Diagnóstico :");

        jLabel6.setText("Fecha Emisión :");

        fechaEmision.setEnabled(false);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel7)
                            .addComponent(jLabel3)
                            .addComponent(jLabel6))
                        .addGap(12, 12, 12)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(especialidad, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addComponent(diagnostico, javax.swing.GroupLayout.PREFERRED_SIZE, 172, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 14, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(fechaEmision, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                            .addComponent(jLabel13)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(campoMontoaPagar))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                            .addComponent(jLabel2)
                            .addGap(10, 10, 10)
                            .addComponent(campoCostoAtencion, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addGap(43, 43, 43))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(especialidad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 19, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1)
                    .addComponent(diagnostico, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(campoCostoAtencion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel13)
                    .addComponent(campoMontoaPagar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel6)
                    .addComponent(fechaEmision))
                .addGap(26, 26, 26))
        );

        botonAceptar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Aceptar.png"))); // NOI18N
        botonAceptar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAceptarActionPerformed(evt);
            }
        });

        botonCancelar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/GUI/Img/Iconos16X16/Cancelar.png"))); // NOI18N
        botonCancelar.setText("Cancelar");
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });

        mensajeriaInformacion.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        mensajeriaInformacion.setText("Área de mensajería");

        jLabel4.setText("*Campos obligatorios");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 347, Short.MAX_VALUE)
                    .addComponent(mensajeriaInformacion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 347, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 347, Short.MAX_VALUE)
                            .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 347, Short.MAX_VALUE))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addComponent(botonAceptar, javax.swing.GroupLayout.PREFERRED_SIZE, 95, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(botonCancelar)))
                    .addComponent(jLabel4, javax.swing.GroupLayout.Alignment.LEADING))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel4)
                        .addGap(29, 29, 29))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 15, Short.MAX_VALUE)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(botonCancelar)
                            .addComponent(botonAceptar))
                        .addGap(9, 9, 9)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(mensajeriaInformacion)
                .addContainerGap(14, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * @method que oye los eventos del botón aceptar
     * @param evt
     */
    private void botonAceptarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAceptarActionPerformed
        this.normalizarMensajeria();
        if (camposObligatoriosLlenos()) {
            service.Paciente paciente = (service.Paciente) cargarPaciente(campoRutPaciente.getText());
            if (paciente != null) {
                if (botonAceptar.getText().equalsIgnoreCase("Exportar")) {
                    service.Privilegios p = (service.Privilegios) cargarPrivilegios(Login.getUser().getRut());
                    if (p.isExportarOrdenDerivacion()) {
                        try {
                            service.OrdenDeDerivacion sd = (service.OrdenDeDerivacion) buscarOrdenDeDerivacion(idDerivacion);
                            this.exportarPDF(sd);
                            this.dispose();
                            cambiarEtiquetaMensajeria(Mensajeria.mensajeDeAccion("Orden de derivación", "exportar"), Color.blue);
                        } catch (Exception ex) {
                            Logger.getLogger(OrdenDeDerivacion.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    } else {
                        JOptionPane.showMessageDialog(this, "No tiene permisos para esta acción, \n contacte al administrador para más información");
                    }
                } else {
                    if (botonAceptar.getText().equalsIgnoreCase("Agregar")) {
                        service.OrdenDeDerivacion or = new service.OrdenDeDerivacion();
                        or.setDiagnostico(this.diagnostico.getText());
                        or.setEspecialidad(this.especialidad.getText());
                        or.setFechaEmision(this.fechaEmision.getText());
                        or.setRutPaciente(this.campoRutPaciente.getText());
                        or.setRutProfesional(this.campoRutProfesional.getText());
                        or.setCostoAtencion(reemplazarMascarillaDinero(this.campoCostoAtencion.getDinero().getText()));
                        or.setVisible(true);
                        agregarOrdenDeDerivacion(or);
                        String valorNuevo = " Rut profesional:" + or.getRutProfesional() + "\n" + " Rut paciente:" + or.getRutPaciente() + "\n" + " Especialidad:" + or.getEspecialidad() + "\n" + " Diagnóstico:" + or.getDiagnostico() + "\n" + " Costo atención:" + or.getCostoAtencion() + "\n" + " Fecha emisión:" + or.getFechaEmision();
                        registrar(Login.getUser(), "Orden de derivación", "Agregó orden de derivación a profesional externo:" + or.getRutProfesional() + "de paciente :" + or.getRutPaciente(), "No aplica", valorNuevo);
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeDeAccion("Orden de derivación", "agregar"), Color.black);
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeDeAccion("Orden de derivación", "agregar"), Color.blue);
                    } else if (botonAceptar.getText().equalsIgnoreCase("Guardar")) {
                        service.OrdenDeDerivacion or = (service.OrdenDeDerivacion) buscarOrdenDeDerivacion(this.idDerivacion);
                        String valorAnterior = " Rut profesional:" + or.getRutProfesional() + "\n" + " Rut paciente:" + or.getRutPaciente() + "\n" + " Especialidad:" + or.getEspecialidad() + "\n" + " Diagnóstico:" + or.getDiagnostico() + "\n" + " Costo atención:" + or.getCostoAtencion() + "\n" + " Fecha emisión:" + or.getFechaEmision();


                        or.setDiagnostico(this.diagnostico.getText());
                        or.setEspecialidad(this.especialidad.getText());
                        or.setFechaEmision(this.fechaEmision.getText());
                        or.setRutPaciente(this.campoRutPaciente.getText());
                        or.setCostoAtencion(reemplazarMascarillaDinero(this.campoCostoAtencion.getDinero().getText()));
                        or.setRutProfesional(this.campoRutProfesional.getText());
                        modificarOrdenDeDerivacion(or);
                        String valorNuevo = " Rut profesional:" + or.getRutProfesional() + "\n" + " Rut paciente:" + or.getRutPaciente() + "\n" + " Especialidad:" + or.getEspecialidad() + "\n" + " Diagnóstico:" + or.getDiagnostico() + "\n" + " Costo atención:" + or.getCostoAtencion() + "\n" + " Fecha emisión:" + or.getFechaEmision();

                        registrar(Login.getUser(), "Orden de derivación", "Modificó orden de derivación a profesional externo:" + or.getRutProfesional() + "de paciente :" + or.getRutPaciente(), valorAnterior, valorNuevo);
                        cambiarEtiquetaMensajeria(Mensajeria.mensajeDeAccion("Orden de derivación", "modificar"), Color.black);
                    }
                    this.dispose();
                    der.actualizarTabla();
                }
            }
        } else {
            this.cambiarEtiquetaMensajeria(Mensajeria.mensajeCamposObligatorios(), Color.red);
        }
    }//GEN-LAST:event_botonAceptarActionPerformed
    public String reemplazarMascarillaDinero(String dinero) {
        if (!dinero.equals("")) {
            return dinero.replace("$", "").replace(".", "");
        } else {
            return "0";
        }
    }

    /**
     * @method evento que permite escuchar el foco cel campo costo de atencion
     */
    public void campoCostoAtencionFocusLost() {
        this.campoCostoAtencion.getDinero().addFocusListener(new FocusListener() {

            @Override
            public void focusGained(FocusEvent e) {
            }

            @Override
            public void focusLost(FocusEvent e) {
                normalizarMensajeria();
                if (!campoRutProfesional.getText().equals("")) {
                    String monto = llenarMontoaPagar();
                    if (!monto.equals("")) {
                        campoMontoaPagar.setText(monto);
                    } else {
                        campoMontoaPagar.setText("");
                    }
                } else {
                }
            }
        });
    }

    /**
     * @method llena el campo de monto a pagar a un profesional
     * @return
     */
    public String llenarMontoaPagar() {
        List<service.Convenio> convenios = listarConvenios();
        boolean encontro = false;
        int porcentaje = 0;
        for (service.Convenio c : convenios) {
            if (c.getRutInstitucion().equals(campoRutProfesional.getText())) {
                encontro = true;
                porcentaje = Integer.parseInt(c.getPorcentaje().replace("%", ""));
            }
        }
        if (!campoCostoAtencion.getDinero().getText().equals("") && encontro) {
            // calculo precio para total
            return darFormatoDinero(Integer.toString((soloNumeros(campoCostoAtencion.getDinero().getText()) * porcentaje) / 100));
        } else {
            if (campoCostoAtencion.getDinero().getText().equals("")) {
                return "";
            } else {
                return "$0";
            }
        }
    }

    /**
     * @method toma un string con mascarilla dinero y retorna otro String solo con los numeros
     * @param dinero
     * @return
     */
    public int soloNumeros(String dinero) {
        String t = dinero.substring(1, dinero.length());
        String num = "";
        for (int i = 0; i < t.length(); i++) {
            if (t.charAt(i) != '.') {
                num = num + t.charAt(i);
            }
        }
        return Integer.parseInt(num);
    }

    /**
     * @method que recibe como parametro un string solo con numeros y le da formato de dinero
     * @param num
     * @return
     */
    public String darFormatoDinero(String num) {


        String a = "";
        int con = 0;
        for (int i = num.length() - 1; i >= 0; i--) {
            if (con == 2 && i > 0) {
                con = 0;
                a = a + num.charAt(i) + ".";
            } else {
                a = a + num.charAt(i);
                con++;
            }
        }
        String b = "";
        for (int i = a.length() - 1; i >= 0; i--) {
            b = b + a.charAt(i);
        }

        return "$" + b;

    }

    /**
     * evento del boton cancelar
     * @param evt
     */
    private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
        this.dispose();
    }//GEN-LAST:event_botonCancelarActionPerformed
    /**
     * evento del combobox paciente
     * @param evt
     */
    private void comboBoxPacienteItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_comboBoxPacienteItemStateChanged
        this.normalizarMensajeria();
        boolean valido = false;
        java.util.List<service.EnlaceProfesionalExternoPaciente> enlaces = (java.util.List<service.EnlaceProfesionalExternoPaciente>) listarEnlaceProfesionalExternoPacientes();
        for (service.EnlaceProfesionalExternoPaciente e : enlaces) {
            service.Paciente pa = (service.Paciente) cargarPaciente(e.getRutPaciente());
            if (isPacienteEnlazadoAProfesionalExterno(pa.getRut(), this.campoRutProfesional.getText()) && this.campoRutProfesional.getText().equals(e.getRutProfesional())) {
                String nombre = pa.getNombres() + " " + pa.getApellidoPaterno() + " " + pa.getApellidoMaterno();
                if (nombre.equalsIgnoreCase((String) evt.getItem())) {
                    campoRutPaciente.setText(pa.getRut());
                    valido = true;
                    break;
                } else {
                    campoRutPaciente.setText("");
                }
            }
        }
//        java.util.List<service.Paciente> lista = (java.util.List<service.Paciente>) listarPacientes();
//        for (service.Paciente paciente : lista) {
//            if (!paciente.getDerivado().equals("") && paciente.getDerivado().equals(this.campoProfesional.getText())) {
//                String nombre = paciente.getNombres() + " " + paciente.getApellidoPaterno() + " " + paciente.getApellidoMaterno();
//                if (nombre.equalsIgnoreCase((String) evt.getItem())) {
//                    campoRutPaciente.setText(paciente.getRut());
//                    valido = true;
//                    break;
//                } else {
//                    campoRutPaciente.setText("");
//                }
//            }
//        }
        if (!valido) {
            campoRutPaciente.setText("");
        }
}//GEN-LAST:event_comboBoxPacienteItemStateChanged

    private void campoMontoaPagarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_campoMontoaPagarActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_campoMontoaPagarActionPerformed

    private void campoCostoAtencionFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_campoCostoAtencionFocusLost
        // TODO add your handling code here:
}//GEN-LAST:event_campoCostoAtencionFocusLost

    private void especialidadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_especialidadActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_especialidadActionPerformed
    /**
     * @method que se encarga de cargar los pacientes que son derivados de un determinado profesional
     * previamente seleccionado
     */
    public void cargarPacientes() {
        comboBoxPaciente.removeAllItems();
        comboBoxPaciente.addItem("Seleccionar");
        java.util.List<service.EnlaceProfesionalExternoPaciente> enlaces = (java.util.List<service.EnlaceProfesionalExternoPaciente>) listarEnlaceProfesionalExternoPacientes();
        for (service.EnlaceProfesionalExternoPaciente e : enlaces) {
            service.Paciente pa = (service.Paciente) cargarPaciente(e.getRutPaciente());
            if (isPacienteEnlazadoAProfesionalExterno(pa.getRut(), this.campoRutProfesional.getText()) && this.campoRutProfesional.getText().equals(e.getRutProfesional())) {
                String nombre = pa.getNombres() + " " + pa.getApellidoPaterno() + " " + pa.getApellidoMaterno();
                comboBoxPaciente.addItem(nombre);
            }
        }
    }

    /**
     * @method metodo que cambia el area de mensajeria
     * @param mensaje parametro String con el contenido del mensaje
     * @param color parametro con el tipo de color a cambiar
     */
    public void cambiarEtiquetaMensajeria(String mensaje, Color color) {
        mensajeriaInformacion.setText(mensaje);
        mensajeriaInformacion.setForeground(color);
    }

    /**
     * @method que se encarga de verificar si los campos introducidos son obligatorios
     * @return
     */
    public boolean camposObligatoriosLlenos() {
        boolean b = false;
        if (!campoRutPaciente.getText().equals("")
                && !campoRutProfesional.getText().equals("")
                && comboBoxPaciente.getSelectedIndex() != 0
                && !campoProfesional.getText().equals("")) {
            b = true;
        }
        return b;
    }

    /**
     * metodo utilizado para elegir la direccion del archivo para exportar a pdf
     * @return
     */
    public String eligeDireccionArchivo() {
        String dirArchivo = "";
        JFileChooser jFileChooser1 = new JFileChooser();
        jFileChooser1.setDialogTitle("Guardar archivo:");
        jFileChooser1.setVisible(true);

        int r = jFileChooser1.showSaveDialog(null);
        if (r == JFileChooser.APPROVE_OPTION) {
            File file = jFileChooser1.getSelectedFile();
            dirArchivo = String.valueOf(file);
        }
        dirArchivo = dirArchivo.replace('\\', '/') + ".pdf";
        return dirArchivo;

    }

    /**
     * @method que se encarga de abrir la direccion del pdf exportado
     * @param direccion
     */
    public void abrirArchivo(String direccion) {
        //Abre el documento pdf
        try {
            File file = new File(direccion);
            Desktop.getDesktop().open(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @method que se encarga de exportar a pdf el formulario de una orden de derivación
     * @param orden
     * @throws Exception
     */
    public void exportarPDF(service.OrdenDeDerivacion orden) throws Exception {
        Font fuenteTitulo = new Font(Font.FontFamily.TIMES_ROMAN, 16, Font.BOLD);
        Font fuenteSubTitulo = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.BOLD);
        Font fuenteTexto = new Font(Font.FontFamily.TIMES_ROMAN, 12, Font.NORMAL);
        JFileChooser jF1 = new javax.swing.JFileChooser();
        String ruta;
        try {
            if (jF1.showSaveDialog(null) == jF1.APPROVE_OPTION) {
                ruta = jF1.getSelectedFile().getAbsolutePath() + ".pdf";
                PdfPTable tabla = new PdfPTable(2);
                tabla.addCell(new PdfPCell(new Paragraph("Rut profesional", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph(orden.getRutProfesional(), fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph("Nombre profesional", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph(campoProfesional.getText(), fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph("Rut paciente", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph(orden.getRutPaciente(), fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph("Nombre paciente", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph((String) comboBoxPaciente.getSelectedItem(), fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph("Especialidad", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph(orden.getEspecialidad(), fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph("Diagnóstico", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph(orden.getDiagnostico(), fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph("Costo atención", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph(darFormatoDinero(orden.getCostoAtencion()), fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph("Monto a pagar", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph(this.llenarMontoaPagar() + " ", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph("Fecha Emisión", fuenteTexto)));
                tabla.addCell(new PdfPCell(new Paragraph(orden.getFechaEmision(), fuenteTexto)));
                Document document = new Document();
                FileOutputStream ficheroPdf = new FileOutputStream(ruta);
                PdfWriter.getInstance(document, ficheroPdf).setInitialLeading(20);
                document.open();
                document.add(new Paragraph("Información Orden de Derivación", fuenteTitulo));
                document.add(new Paragraph(" ", fuenteTexto));
                document.add(tabla);

                document.close();
                abrirArchivo(ruta);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public JButton getBotonAceptar() {
        return this.botonAceptar;
    }

    public JButton getBotonCancelar() {
        return this.botonCancelar;
    }

    /**
     *@method metodo que se encarga de habilitar los campos
     */
    public void habilitarCampos() {
        this.mostrarCampos();
        this.campoCostoAtencion.getDinero().setEnabled(true);
        this.comboBoxPaciente.setEnabled(true);
        especialidad.setEditable(true);
        diagnostico.setEditable(true);
    }

    /**
     * @method que se encarga de inhabilitar los campos
     */
    public void inhabilitarCampos() {
        this.ocultarCampos();
        this.campoCostoAtencion.getDinero().setEnabled(false);
        campoRutPaciente.setEditable(false);
        campoRutProfesional.setEditable(false);
        this.comboBoxPaciente.setEnabled(false);
        this.campoProfesional.setEditable(false);
        especialidad.setEditable(false);
        diagnostico.setEditable(false);
    }

    /**
     * @method que se encarga de limpiar los campos
     */
    public void limpiarCampos() {
        campoRutPaciente.setText("");
        campoCostoAtencion.getDinero().setText("");
        this.campoMontoaPagar.setText("");
        comboBoxPaciente.setSelectedIndex(0);
        campoRutProfesional.setText("");
        campoProfesional.setText("");
        especialidad.setText("");
        diagnostico.setText("");
        Calendar cal = Calendar.getInstance();
        String fecha = Integer.toString(cal.get(Calendar.DAY_OF_MONTH)) + "-"
                + Integer.toString(cal.get(Calendar.MONTH) + 1) + "-"
                + Integer.toString(cal.get(Calendar.YEAR));
        fechaEmision.setText(fecha);
        normalizarMensajeria();
    }

    /**
     * @method que se encarga de llenar los campos del formulario orden de derivacion
     * @param pres
     */
    public void llenarCampos(service.OrdenDeDerivacion pres) {
        limpiarCampos();

        java.util.List<service.Convenio> convenios = listarConvenios();
        String nombreProfesional = "";
        service.ProfesionalExterno us = (service.ProfesionalExterno) cargarProfesionalExterno(pres.getRutProfesional());
        nombreProfesional = us.getNombres() + " " + us.getApellidoPaterno() + " " + us.getApellidoMaterno();
        idDerivacion = pres.getId();
        campoRutProfesional.setText(pres.getRutProfesional());
        campoProfesional.setText(nombreProfesional);
        this.cargarPacientes();
        campoRutPaciente.setText(pres.getRutPaciente());
        service.Paciente p = (service.Paciente) cargarPaciente(pres.getRutPaciente());
        String nombrePaciente = p.getNombres() + " " + p.getApellidoPaterno() + " " + p.getApellidoMaterno();
        comboBoxPaciente.setSelectedItem(nombrePaciente);
        fechaEmision.setText(pres.getFechaEmision());
        this.campoCostoAtencion.getDinero().setText(darFormatoDinero(pres.getCostoAtencion()));
        this.campoMontoaPagar.setText(this.llenarMontoaPagar());
        especialidad.setText(pres.getEspecialidad());
        diagnostico.setText(pres.getDiagnostico());
    }

    /**
     * @method que que normaliza el area de mensajeria
     */
    public void normalizarMensajeria() {
        mensajeriaInformacion.setText("Área de mensajería");
        mensajeriaInformacion.setForeground(Color.black);
    }

    /**
     * @method que convierte un string a fecha
     * @param strFecha
     * @return
     */
    public Date stringToDate(String strFecha) {
        SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd-MM-yyyy");
        Date fecha = null;
        try {
            fecha = formatoDelTexto.parse(strFecha);
        } catch (ParseException ex) {
            ex.printStackTrace();
        }
        return fecha;
    }

    /**
     * @method que oculta los campos *
     */
    public void ocultarCampos() {
        this.jLabel8.setVisible(false);
        this.jLabel4.setVisible(false);
        this.mensajeriaInformacion.setVisible(false);
    }

    /**
     * @method que muestra los campos *
     */
    public void mostrarCampos() {
        this.jLabel8.setVisible(false);
        this.jLabel4.setVisible(true);
        this.mensajeriaInformacion.setVisible(true);
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonAceptar;
    private javax.swing.JButton botonCancelar;
    private componentes.Dinero campoCostoAtencion;
    private javax.swing.JTextField campoMontoaPagar;
    private javax.swing.JTextField campoProfesional;
    private javax.swing.JTextField campoRutPaciente;
    private javax.swing.JTextField campoRutProfesional;
    private javax.swing.JComboBox comboBoxPaciente;
    private javax.swing.JTextField diagnostico;
    private javax.swing.JTextField especialidad;
    private javax.swing.JTextField fechaEmision;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JLabel mensajeriaInformacion;
    // End of variables declaration//GEN-END:variables

    private static java.util.List<service.Convenio> listarConvenios() {
        service.ConvenioWSService service = new service.ConvenioWSService();
        service.ConvenioWS port = service.getConvenioWSPort();
        return port.listarConvenios();
    }

    private static boolean agregarOrdenDeDerivacion(service.OrdenDeDerivacion ordenDeDerivacion) {
        service.OrdenDeDerivacionWSService service = new service.OrdenDeDerivacionWSService();
        service.OrdenDeDerivacionWS port = service.getOrdenDeDerivacionWSPort();
        return port.agregarOrdenDeDerivacion(ordenDeDerivacion);
    }

    private static boolean modificarOrdenDeDerivacion(service.OrdenDeDerivacion ordenDeDerivacion) {
        service.OrdenDeDerivacionWSService service = new service.OrdenDeDerivacionWSService();
        service.OrdenDeDerivacionWS port = service.getOrdenDeDerivacionWSPort();
        return port.modificarOrdenDeDerivacion(ordenDeDerivacion);
    }

    private static java.util.List<service.OrdenDeDerivacion> listarDerivaciones() {
        service.OrdenDeDerivacionWSService service = new service.OrdenDeDerivacionWSService();
        service.OrdenDeDerivacionWS port = service.getOrdenDeDerivacionWSPort();
        return port.listarDerivaciones();
    }

    private static Object cargarPaciente(java.lang.String rut) {
        service.PacienteWS_Service service = new service.PacienteWS_Service();
        service.PacienteWS port = service.getPacienteWSPort();
        return port.cargarPaciente(rut);
    }

    private static Object buscarOrdenDeDerivacion(java.lang.Long idOrden) {
        service.OrdenDeDerivacionWSService service = new service.OrdenDeDerivacionWSService();
        service.OrdenDeDerivacionWS port = service.getOrdenDeDerivacionWSPort();
        return port.buscarOrdenDeDerivacion(idOrden);
    }

    private static Long registrar(service.Usuario usuario, java.lang.String modulo, java.lang.String accion, java.lang.String valorAnterior, java.lang.String valorNuevo) {
        service.BitacoraWSService service = new service.BitacoraWSService();
        service.BitacoraWS port = service.getBitacoraWSPort();
        return port.registrar(usuario, modulo, accion, valorAnterior, valorNuevo);
    }

    private static Object cargarUsuario(java.lang.String rut) {
        service.UsuarioWSService service = new service.UsuarioWSService();
        service.UsuarioWS port = service.getUsuarioWSPort();
        return port.cargarUsuario(rut);
    }

    private static Object cargarProfesionalExterno(java.lang.String rut) {
        service.ProfesionalExternoWSService service = new service.ProfesionalExternoWSService();
        service.ProfesionalExternoWS port = service.getProfesionalExternoWSPort();
        return port.cargarProfesionalExterno(rut);
    }

    private static Object cargarPrivilegios(java.lang.String rut) {
        service.PrivilegiosWS_Service service = new service.PrivilegiosWS_Service();
        service.PrivilegiosWS port = service.getPrivilegiosWSPort();
        return port.cargarPrivilegios(rut);
    }

    private static java.util.List<service.Paciente> listarPacientes() {
        service.PacienteWS_Service service = new service.PacienteWS_Service();
        service.PacienteWS port = service.getPacienteWSPort();
        return port.listarPacientes();
    }

    private static java.util.List<service.EnlaceProfesionalExternoPaciente> listarEnlaceProfesionalExternoPacientes() {
        service.EnlaceProfesionalExternoPacienteWSService service = new service.EnlaceProfesionalExternoPacienteWSService();
        service.EnlaceProfesionalExternoPacienteWS port = service.getEnlaceProfesionalExternoPacienteWSPort();
        return port.listarEnlaceProfesionalExternoPacientes();
    }

    private static boolean isPacienteEnlazadoAProfesionalExterno(java.lang.String rutPaciente, java.lang.String rutProfesional) {
        service.EnlaceProfesionalExternoPacienteWSService service = new service.EnlaceProfesionalExternoPacienteWSService();
        service.EnlaceProfesionalExternoPacienteWS port = service.getEnlaceProfesionalExternoPacienteWSPort();
        return port.isPacienteEnlazadoAProfesionalExterno(rutPaciente, rutProfesional);
    }
}
